#ifndef SETTINGSMANAGER_H
#define SETTINGSMANAGER_H

#include <QObject>
#include <QSettings>
#include <QFont>
#include <QSize>
#include <QPoint>
#include <QStringList>

/**
 * @brief 应用程序设置管理器
 * 负责保存和加载应用程序的各种设置，包括窗口状态、主题、字体等
 */
class SettingsManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 主题类型
     */
    enum Theme {
        LightTheme,   // 浅色主题
        DarkTheme     // 深色主题
    };
    Q_ENUM(Theme)

    /**
     * @brief 预览模式
     */
    enum PreviewMode {
        PreviewDisabled,  // 禁用预览
        PreviewHorizontal, // 水平分栏预览
        PreviewVertical    // 垂直分栏预览
    };
    Q_ENUM(PreviewMode)

    /**
     * @brief 语言类型
     */
    enum Language {
        Chinese,  // 中文
        English   // 英文
    };
    Q_ENUM(Language)

    explicit SettingsManager(QObject *parent = nullptr);
    ~SettingsManager() override;

    /**
     * @brief 加载设置
     * 从配置文件或注册表加载设置
     */
    void load();

    /**
     * @brief 保存设置
     * 将当前设置保存到配置文件或注册表
     */
    void save();

    /**
     * @brief 获取当前主题
     * @return 当前主题
     */
    Theme theme() const { return m_theme; }

    /**
     * @brief 设置主题
     * @param theme 新主题
     */
    void setTheme(Theme theme);

    /**
     * @brief 获取当前预览模式
     * @return 当前预览模式
     */
    PreviewMode previewMode() const { return m_previewMode; }

    /**
     * @brief 设置预览模式
     * @param mode 新预览模式
     */
    void setPreviewMode(PreviewMode mode);

    /**
     * @brief 检查预览是否启用
     * @return 如果预览启用则返回true
     */
    bool previewEnabled() const { return m_previewMode != PreviewDisabled; }

    /**
     * @brief 获取当前字体
     * @return 当前字体
     */
    QFont font() const { return m_font; }

    /**
     * @brief 设置字体
     * @param font 新字体
     */
    void setFont(const QFont &font);

    /**
     * @brief 获取窗口大小
     * @return 窗口大小
     */
    QSize windowSize() const { return m_windowSize; }

    /**
     * @brief 设置窗口大小
     * @param size 新窗口大小
     */
    void setWindowSize(const QSize &size);

    /**
     * @brief 获取窗口位置
     * @return 窗口位置
     */
    QPoint windowPosition() const { return m_windowPosition; }

    /**
     * @brief 设置窗口位置
     * @param pos 新窗口位置
     */
    void setWindowPosition(const QPoint &pos);

    /**
     * @brief 获取当前语言
     * @return 当前语言
     */
    Language language() const { return m_language; }

    /**
     * @brief 设置语言
     * @param lang 新语言
     */
    void setLanguage(Language lang);

    /**
     * @brief 获取自动保存间隔（分钟）
     * @return 自动保存间隔
     */
    int autoSaveInterval() const { return m_autoSaveInterval; }

    /**
     * @brief 设置自动保存间隔
     * @param interval 间隔（分钟）
     */
    void setAutoSaveInterval(int interval);

    /**
     * @brief 获取最近文件列表
     * @return 最近文件路径列表
     */
    QStringList recentFiles() const { return m_recentFiles; }

    /**
     * @brief 设置最近文件列表
     * @param files 文件路径列表
     */
    void setRecentFiles(const QStringList &files);

    /**
     * @brief 添加最近文件
     * @param path 文件路径
     * @param maxCount 最大文件数
     */
    void addRecentFile(const QString &path, int maxCount = 10);

    /**
     * @brief 清除最近文件列表
     */
    void clearRecentFiles();

    /**
     * @brief 获取插件目录
     * @return 插件目录路径
     */
    QString pluginsDirectory() const { return m_pluginsDirectory; }

    /**
     * @brief 设置插件目录
     * @param path 插件目录路径
     */
    void setPluginsDirectory(const QString &path);

    /**
     * @brief 获取启用的插件列表
     * @return 插件名称列表
     */
    QStringList enabledPlugins() const { return m_enabledPlugins; }

    /**
     * @brief 设置启用的插件列表
     * @param plugins 插件名称列表
     */
    void setEnabledPlugins(const QStringList &plugins);

    /**
     * @brief 检查插件是否启用
     * @param pluginName 插件名称
     * @return 如果启用则返回true
     */
    bool isPluginEnabled(const QString &pluginName) const;

    /**
     * @brief 切换插件启用状态
     * @param pluginName 插件名称
     * @param enabled 是否启用
     */
    void setPluginEnabled(const QString &pluginName, bool enabled);

signals:
    /**
     * @brief 当主题更改时发出
     * @param theme 新主题
     */
    void themeChanged(Theme theme);

    /**
     * @brief 当预览模式更改时发出
     * @param mode 新模式
     */
    void previewModeChanged(PreviewMode mode);

    /**
     * @brief 当字体更改时发出
     * @param font 新字体
     */
    void fontChanged(const QFont &font);

    /**
     * @brief 当语言更改时发出
     * @param language 新语言
     */
    void languageChanged(Language language);

    /**
     * @brief 当最近文件列表更改时发出
     * @param files 新文件列表
     */
    void recentFilesChanged(const QStringList &files);

    /**
     * @brief 当插件设置更改时发出
     */
    void pluginsChanged();

private:
    QSettings *m_settings;          // QSettings实例
    Theme m_theme;                  // 当前主题
    PreviewMode m_previewMode;      // 预览模式
    QFont m_font;                   // 当前字体
    QSize m_windowSize;             // 窗口大小
    QPoint m_windowPosition;        // 窗口位置
    Language m_language;            // 当前语言
    int m_autoSaveInterval;         // 自动保存间隔（分钟）
    QStringList m_recentFiles;      // 最近文件列表
    QString m_pluginsDirectory;     // 插件目录
    QStringList m_enabledPlugins;   // 启用的插件列表

    /**
     * @brief 初始化默认设置
     */
    void initDefaults();
};

#endif // SETTINGSMANAGER_H